<?php


class Func_Common
{

    private static $obj = null;

    private function __construct()
    {
    }

    /**
     * 获取单例对象
     * @param string $hl
     * @param number $timeout
     * @return Func_Common
     */
    public static function getInstance()
    {
        if (is_null(self::$obj)) {
            self::$obj = new self ();
        }
        return self::$obj;
    }
    public function ID_to_encrypt($idcard)
    {
        if(!self::checkCard($idcard)){
            return $idcard;
        }
        return substr($idcard , 0 , 5) . '******' .substr($idcard , -4);

    }
    public function ID_to_sex($idcard)
    {
        if (empty($idcard)) return null;
        $sexint = (int)substr($idcard, 16, 1);
        return $sexint % 2 === 0 ? '女' : '男';
    }

    public function ID_to_sex_num($idcard)
    {
        if (empty($idcard)) return null;
        $sexint = (int)substr($idcard, 16, 1);
        return $sexint % 2 === 0 ? 2 : 1;
    }

    public function ID_to_birthday($idcard)
    {
        if (empty($idcard)) return null;
        $bir = substr($idcard, 6, 8);
        $year = (int)substr($bir, 0, 4);
        $month = (int)substr($bir, 4, 2);
        $day = (int)substr($bir, 6, 2);
        return $year . "年" . $month . "月" . $day . '日';
    }

    public function ID_to_age($idcard)
    {
        if (empty($idcard)) return null;
        #  获得出生年月日的时间戳
        $date = strtotime(substr($idcard, 6, 8));
        #  获得今日的时间戳
        $today = strtotime('today');
        #  得到两个日期相差的大体年数
        $diff = floor(($today - $date) / 86400 / 365);
        #  strtotime加上这个年数后得到那日的时间戳后与今日的时间戳相比
        $age = strtotime(substr($idcard, 6, 8) . ' +' . $diff . 'years') > $today ? ($diff + 1) : $diff;
        return $age;
    }

    /**
     * @desc 利率处理
     * @param $data
     * @return string
     */
    public function percent($data)
    {
        if (empty($data)) {
            return $data;
        }
        if (strpos($data, '%')) {
            return (string)$data;
        } else {
            return (string)($data * 100).'%';
        }
    }


    /**
     * @desc 原告扣款  (服务费+违约金+逾期利息)-其他费用
     * @param array $arr
     * @param int $money
     * @return array
     */
    public function chargeback($arr = [], $money = 0)
    {
        if (empty($arr) || empty($money)) {
            return $arr;
        }
        foreach ($arr as $k => $v) {
            if ($v > $money) {
                $arr[$k] = Func_Case::formatFloat($v - $money);
                break;
            } else {
                $arr[$k] = 0;
                if ($v > 0) {
                    $money = Func_Case::formatFloat($money - $v);
                }
            }
        }

        return $arr;
    }

    //读取文件夹下面的单文件
    public function readFile($path){
        $files = [];
        if(!file_exists($path)){
            return $files;
        }
        $allfile = scandir($path);
        if(empty($allfile)){
            return $files;
        }
        foreach($allfile as $v) {
            if ($v != '.' && $v != '..') {
                $dirname = __DIR__ .'/'  . $v;  //子文件夹的目录地址

                if (!is_dir($dirname)) {
                    $files[] = $v;
                }
            }
        }
        return $files;
    }

    /**
     * 检测身份证号
     */
    public static function checkCard($cardId) {

        if (!$cardId) {
            return false;
        }
        $regx= '#(^\d{15}$)|(^\d{17}(\d|x)$)|(^\d{17}(\d|X)$)#';
        $res = preg_match($regx, $cardId);
        return $res ? true : false;
    }
    /**
     * 检测身份证号
     */
    public static function checkCard6($cardId) {
        if (!$cardId) {
            return false;
        }
        if(strlen((string)$cardId) == 6){
            $regx= '#(^\d{5}(\d|x)$)|(^\d{5}(\d|X)$)#';
            $res = preg_match($regx, $cardId);
            return $res ? true : false;
        }else{
            $regx= '#(^\d{15}$)|(^\d{17}(\d|x)$)|(^\d{17}(\d|X)$)#';
            $res = preg_match($regx, $cardId);
            return $res ? true : false;
        }


    }

    /**
     * 检测手机号
     */
    public static function checkMobile($mobile) {
        if (!$mobile) {
            return false;
        }
        if(preg_match("/^1[3456789]\d{9}$/", $mobile)){
            return true;
        }
        return false;
    }
    /**
     * 检测是否是整数
     */
    public static function checkInt($number) {
        if (!$number) {
            return false;
        }
        if(floor($number) == $number){
            return true;
        }
        return false;
    }
    /**
     * 检测是否是整数
     */
    public static function checkAmount($amount) {
        // 必须是整数或浮点数
        if (!is_numeric($amount)){
            return false;
        }
        // 不为负数
        if ((int)($amount * 100) < 0){
            return false;
        }
        return true;
    }
    /**
     * 检测是否是日期
     */
    public static function checkDate($date) {
        if(strtotime($date)){
            return true;
        }
        return false;

    }
    /**
     * 检测是否是日期
     */
    public static function checkRate($rate) {
        if(is_numeric($rate) && $rate > 0 && $rate <= 1){
            return true;
        }
        return false;

    }

    public static function convertToUtf8($content){
        if(empty($content)){
            return $content;
        }
        $encode = mb_detect_encoding($content, array('ASCII','UTF-8','GB2312','GBK','BIG5','EUC-CN'));
        if($encode != 'UTF-8'){
            $content = mb_convert_encoding($content, 'UTF-8',$encode);
        }
        return $content;
    }

    //数字转中文
    public static function numToWord($num)
    {
        $cnNumbers = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
        $retval = '';
        $section = intval($num / 1000); // 取得千位数
        if ($section) {
            $retval .= $cnNumbers[$section] . '千';
        }
        $num %= 1000; // 取后三位数
        $section = intval($num / 100); // 取得百位数
        if ($section) {
            $retval .= $cnNumbers[$section] . '百';
        }
        $num %= 100; // 取后两位数
        $section = intval($num / 10); // 取得十位数
        if ($section) {
            $retval .= $cnNumbers[$section] . '十';
        }
        $num %= 10; // 取最后一位数
        if ($num) {
            $retval .= $cnNumbers[$num];
        }
        return $retval;

    }
}